package fr.xebia;

import org.apache.log4j.Logger;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;

import xke.xwfc.biz.CallGirlBackend;
import xke.xwfc.biz.UnknowCallGirl;
import xke.xwfc.biz.domain.CallGirl;
import fr.xebia.beans.Panier;
import fr.xebia.beans.PricedCallGirl;

/**
 * 
 */
public class PanierPage extends BasePage {

	private static final long serialVersionUID = 1L;

	private static final Logger logger = Logger.getLogger(PanierPage.class);
	
	/**
	 * Constructor that is invoked when page is invoked without a session.
	 * 
	 * @param parameters
	 *            Page parameters
	 * @throws UnknowCallGirl
	 */
	public PanierPage() {
		Panier panier = getPanier();
		addPanier(panier);
		addMessage(panier);
	}

	public PanierPage(final String prenom, final String typeSoiree) {
		this(prenom, typeSoiree, false);
	}

	public PanierPage(final String prenom, final String typeSoiree, boolean remove) {
		Panier panier = getPanier();
		try {
			if (remove) {
				logger.debug("Suppression d'une callgirl, prenom: "+prenom);
				panier.removeCallGirl(prenom);
				addMessage(panier);
			} else {
				addCallGirl(panier, prenom, typeSoiree);
			}
		} catch (UnknowCallGirl e) {
			if (remove) {
				addMessage("Impossible de supprimer la callgirl, callgirl introuvable ("+prenom+")");
			} else {
				addMessage("Impossible d'ajouter la callgirl, callgirl introuvable ("+prenom+")");
			}
		}
		addPanier(panier);
	}

	private Panier getPanier() {
		XkeWebSession session = getWebSession();
		Panier panier = session.getPanier();
		if (panier == null) {
			panier = new Panier();
			session.addPanier(panier);
		}
		return panier;
	}

	private void addCallGirl(Panier panier, final String prenom, final String typeSoiree) throws UnknowCallGirl {
		CallGirl callGirl = CallGirlBackend.fetch(prenom);
		if (panier.containsCallGirl(prenom)) {
			addMessage("Cette callgirl est deja dans votre panier");
		} else {
			panier.addCallGirl(new PricedCallGirl(callGirl, typeSoiree));
			addMessage(panier);
		}
	}	

	private void addPanier(Panier panier) {
		logger.debug(panier.getCallGirls());
		ListView callGirlsListView = new ListView("callGirls", panier.getCallGirls()) {
			private static final long serialVersionUID = 1L;

			public void populateItem(final ListItem listItem) {
				final PricedCallGirl callGirl = (PricedCallGirl) listItem.getModelObject();
				listItem.add(new Label("prenom", callGirl.getFirstName()));
				listItem.add(new Label("typeSoiree", callGirl.getTypeSoiree()));
				listItem.add(new Label("price", String.valueOf(callGirl.getPrice())));
				Link removeLink = new Link("removeLink"){
					private static final long serialVersionUID = 1L;

					@Override
					public void onClick() {
						setResponsePage(new PanierPage(callGirl.getFirstName(), callGirl.getTypeSoiree(), true));
					}
				};
				listItem.add(removeLink);
			}
		};
		add(callGirlsListView);
		add(new Label("total", String.valueOf(panier.getTotal())));
	}

	private void addMessage(Panier panier) {
		String message = "";
		if (panier.getCallGirls().size() == 0) {
			message = "Vous n'avez aucune callgirl dans votre panier";
		} else {
			message = "Vous avez "+panier.getCallGirls().size()+" callgirls dans votre panier";
		}
		addMessage(message);
	}

	private void addMessage(String message) {
		add(new Label("message", message));
	}
}
